// 统一封装接口方法
// 每个方法负责请求一个url地址
// 逻辑页面，只要导入这个接口方法，就能发请求了
// 好处：请求url路径，可以在这里统一管理
import axios from '@/utils/request.js'
import { getStorage } from '@/utils/storage'
// import { getToken } from '@/utils/token'
// 频道-获取所有频道
export const getAllChannelsAPI = () => {
  return axios({
    url: '/v1_0/channels',
    method: 'GET'
  })
}

// 获取登录接口数据
// 这个axios是上面import axios from '@/utils/request.js'的axios变量名字 这个是自定义的 你成用request接收  这个就写成request
// axios内部，会把参数对象转成json字符串格式发给后台
// axiox内部，会自动携带请求参数(headers)里，Content-Type:'application/json'帮你添加好 如果不是application/json这种类型，自己加上
export const loginAPI = ({ mobile, code }) => axios({
  url: '/v1_0/authorizations',
  method: 'POST',
  data: {
    mobile,
    code
  }
})
// 获取用户的频道数据(就是那个tab导航栏--推荐、html之类的那个)
// 这个箭头函数要是写了大括号就要写return，只不过函数体这里只有一个表达式就省略了
export const getUserChannelsAPI = () => axios({
  url: '/v1_0/user/channels'
  // 请求拦截器里写了
  // headers: {
  //   Authorization: `Bearer ${getToken()}`
  // }
})
// 获取文章新闻推荐
export const getAllArticlesListAPI = ({
  // 这里面是需要外面传值的
  channel_id,
  timestamp
}) => axios({
  url: '/v1_0/articles',
  params: {
    // 这里的参数，axios会帮你拼接在url？后面(查询字符串)
    channel_id,
    timestamp
  }
  // headers: {
  //   Authorization: `Bearer ${getToken()}`
  // }
})
// 获取不感兴趣数据
export const getDislikeAriticlesAPI = ({ artId }) => axios({
  url: '/v1_0/article/dislikes',
  method: 'POST',
  // headers: {
  //   Authorization: `Bearer ${getToken()}`
  // },
  data: {
    target: artId
  }
})
// 获取举报文章数据
// 401是客户端写的参数有问题。客户端写的404地址有问题
export const getReportArticleAPI = ({ artId, type }) => axios({
  url: '/v1_0/article/reports',
  method: 'POST',
  // headers: {
  //   Authorization: `Bearer ${getToken()}`
  // },
  data: {
    target: artId,
    type: type,
    remark: '如果你想写,可以在逻辑页面判断一下,如果点击类型是0,再给一个弹出框的输入框输入其他问题,传参到这里'
  }
})
// 设置用户的频道（重置式）
export const getUpdateChannelsAPI = ({ channels }) => axios({
  url: '/v1_0/user/channels',
  method: 'PUT',
  data: {
    channels // 用户已选整个频道数组
  }
})
// 删除指定用户频道
export const getDeleteChannelAPI = ({ channelId }) => axios({
  url: `/v1_0/user/channels/${channelId}`,
  method: 'DELETE'
})
// 获取联想建议（自动补全）
export const getSuggestListAPI = ({ keywords }) => axios({
  url: '/v1_0/suggestion',
  params: {
    q: keywords
  }

})
// 获取搜索结果
export const getSearchListAPI = ({
  page = 1,
  per_page = 200000, // 默认每页数量200000个数据
  q
}) => axios({
  url: '/v1_0/search',
  params: {
    page,
    per_page,
    q // 搜索关键词
  }
})
// 获取文章新闻详情--路径传参-问号传参-query(这个看路由跳转的时候地址栏上的地址有问号)
export const getArticleDetailAPI = ({ artId }) => axios({
  url: `/v1_0/articles/${artId}`
})
// 关注用户
export const followUserAPI = ({ userId }) => axios({
  url: '/v1_0/user/followings',
  method: 'POST',
  data: {
    target: userId
  }

})
// 取消关注用户
export const noFollowUserAPI = ({ userId }) => axios({
  url: `/v1_0/user/followings/${userId}`,
  method: 'DELETE'
})
// 对文章点赞
export const loveArticleAPI = ({ artId }) => axios({
  url: '/v1_0/article/likings',
  method: 'POST',
  data: {
    target: artId
  }
})
// 取消对文章点赞
export const noLoveArticleAPI = ({ artId }) => axios({
  url: `/v1_0/article/likings/${artId}`,
  method: 'DELETE'
})
// 获取评论或评论回复-对文章
export const getCommentsListAPI = ({ artId, offset = null, limit = 10 }) => axios({
  url: '/v1_0/comments',
  // query查询字符串-拼在？后面，可以自己拼，可以在params里，让axios帮你拼
  params: { // axios只针对params参数，如果发现键值对，值为null，会忽略此参数名和值不携带在url?后面
    type: 'a', // 什么时候需要外面传：此值会变化
    source: artId,
    offset,
    limit
  }
})
// 对评论或评论回复点赞
export const likeCommentsAPI = ({ comId }) => axios({
  url: '/v1_0/comment/likings',
  method: 'POST',
  data: {
    target: comId
  }
})
// 取消对评论或评论回复点赞
export const noLikeCommentsAPI = ({ comId }) => axios({
  url: `/v1_0/comment/likings/${comId}`,
  method: 'DELETE'
})
// 对文章或者评论进行评论
export const sentCommentsAPI = ({ id, content, art_id = null }) => {
  const obj = {
    target: id, // 评论的目标id（评论文章即为文章id，对评论进行回复则为评论id）
    content // 评论内容
  }
  if (art_id !== null) {
    obj.art_id = art_id // 如果本次有第三个参数，证明是对评论进行回复
    /// 文章id，对评论内容发表回复时，需要传递此参数，表明所属文章id。对文章进行评论，不要传此参数。
  }
  return axios({
    // axios中，data请求体传参，如果值为null是不会忽略这个参数的
    // 它也会把参数名把值携带给后台，只有params遇到空才会忽略
    // 形参上的artId是可选参数，如果逻辑页面是对文章评论，则不需要传递artId，所以这时，内部artId值为null就证明此次调用，是针对文章评论
    // data请求体对象需要自己处理
    url: '/v1_0/comments',
    method: 'POST',
    data: obj
  })
}
// 获取用户自己信息(给我的页面进行显示数据)
export const getUserInfoAPI = () => axios({
  url: '/v1_0/user'
})
// // 获取编辑用户个人资料
export const getUserAPI = () => axios({
  url: '/v1_0/user/profile'
})
// 编辑用户照片资料（头像、身份证照片）
export const getUserPhotoAPI = (fd) => axios({
  url: '/v1_0/user/photo',
  method: 'PATCH',
  // 如果请求体直接是一个FormData表单对象，你也不用自己添加content-type
  // axiox发现请求体是一个表单对象，它也不会转换成json字符串，也不会带content-type：application/json，而是交给浏览器，浏览器发现请求体是表单，会自己携带content-type
  // content-type：application/json；这是axios携带的，前提：data请求体是对象，它会帮你转成json字符串发给后台
  // content-type：multipart/form-data；这是浏览器携带的，前提：data请求体是FormData表单类型的对象，它会自动携带
  data: fd // 这个fd是外面一会传过来的new FormData()表单对象  切记这个一定不要加{}
})
// 编辑用户个人资料
export const getUserEditAPI = (dataObj) => {
  // 判断，有值才带参数给后台，无值参数名都不想携带
  // 写法1：解构赋值+4个判断(以前做过)
  // 写法2：外面想传几对key/value就直接传入交给后台
  // 写法3：上面写法不够语义化，我看不出obj里有什么
  // let dataObj = {
  //   a: 10,
  //   birthday: ''
  // }
  const obj = {
    name: '',
    gender: 0,
    birthday: '',
    intro: ''
  }
  for (const prop in obj) { // 遍历参数对象的每个Key
    if (dataObj[prop] === undefined) { // 用key去外面传入的参数对象匹配，如果没有找到(证明外面没传这个参数)
      delete obj[prop] // 从obj身上移除这对属性和值
    } else {
      obj[prop] = dataObj[prop] // 如果使用了，就从外面对象取出对应key值，保存到obj上
    }
  }
  return axios({
    url: '/v1_0/user/profile',
    method: 'PATCH',
    // data: { // data是不会忽略值为Null的那对key/value，params才会，那data该怎么做呢
    //   name, // 昵称
    //   gender, // 性别0：男，1：女
    //   birthday, // 生日(要求格式：年-月-日)
    //   intro // 个人介绍
    // }
    data: obj
  })
}
// 刷新用户token
export const updateTokenAPI = () => axios({
  url: '/v1_0/authorizations',
  method: 'PUT',
  headers: {
    // 请求拦截器统一携带的是token，而这次请求需要携带的是refresh_token
    // 所以在axios请求拦截器里的判断，就是为了这种情况准备的 Bearer后面有个空格
    // Authorization: 'Bearer ' + localStorage.getItem('refresh_token')
    Authorization: 'Bearer ' + getStorage('refresh_token')
  }
})
